import java.util.Arrays;

public class PrimeNumbers2 {

    // 使用埃拉托色尼筛法找出1到20000之间的所有素数
    public static void sieveOfEratosthenes(int n) {
        // 创建一个布尔数组，初始所有元素为true，表示所有数都是素数
        boolean[] isPrime = new boolean[n + 1];
        Arrays.fill(isPrime, true);
        isPrime[0] = false; // 0 不是素数
        isPrime[1] = false; // 1 不是素数

        // 开始筛选素数
        for (int p = 2; p * p <= n; p++) {
            if (isPrime[p]) {
                // 将p的所有倍数标记为非素数
                for (int i = p * p; i <= n; i += p) {
                    isPrime[i] = false;
                }
            }
        }

        // 打印素数，每行5个
        int count = 0;
        for (int i = 2; i <= n; i++) {
            if (isPrime[i]) {
                System.out.printf("%-8d", i);  // 格式化输出
                count++;
                if (count % 5 == 0) {
                    System.out.println();
                }
            }
        }
        // 如果最后一行不足5个数，换行
        if (count % 5 != 0) {
            System.out.println();
        }
    }

    public static void main(String[] args) {
        int n = 20000;
        System.out.println("1 到 " + n + " 内的所有素数：");
        sieveOfEratosthenes(n);
    }
}

